package com.kinyx.framework.db.sentence.str;

import java.util.ArrayList;
import java.util.List;

import com.kinyx.framework.Configs;
import com.kinyx.framework.bean.StringFormatter;
import com.kinyx.framework.db.sentence.defines.SelectSentence;
import com.kinyx.framework.enums.impl.ErrorCodeX;
import com.kinyx.framework.exception.KRuntimeException;
import com.kinyx.framework.utils.KArrayUtils;

import lombok.Getter;

/**
 * 查询语句
 */
public class SELECT extends _CRUD implements SelectSentence {

	@Override
	public boolean isSQL() { return true; }

	// ================================================================= 分页数据 ================================================================= //
	/** 分页查询页码 */
	@Getter
	private int pageNumber = 0;

	/**
	 * 设置分页查询页码
	 * @param pageNumber 页码
	 * @return 本对象
	 */
	public SELECT pageNumber(final int pageNumber) { this.pageNumber = pageNumber; return this; }

	/** 分页/列表查询页面大小 */
	@Getter
	private int pageSize = Configs.default_pageSize;

	/**
	 * 设置分页/列表查询页面大小
	 * @param pageSize 分页/列表查询页面大小
	 * @return 本对象
	 */
	public SELECT pageSize(final int pageSize) { this.pageSize = pageSize; return this; }

	// ================================================================= 分页数据 ================================================================= //
	private SQL sql = new SQL();

	/**
	 * 追加语句
	 * @param sql 语句
	 * @return 本对象
	 */
	public SELECT s(final String sql) {
		this.sql.s(sql);
		return this;
	}

	/**
	 * 追加参数
	 * @param param 参数
	 * @return 本对象
	 */
	public SELECT p(final Object param) {
		this.sql.p(param);
		return this;
	}

	/**
	 * 追加语句和参数
	 * @param sql 语句
	 * @param param 参数
	 * @return 本对象
	 */
	public SELECT x(final String sql, final Object param) {
		this.sql.x(sql, param);
		return this;
	}

	/**
	 * 追加语句和参数
	 * @param sql 语句
	 * @param param 参数
	 * @param params 参数
	 * @return 本对象
	 */
	public SELECT x(final String sql, final Object param, final Object... params) {
		this.s(sql).p(param);
		if (!KArrayUtils.isEmpty(params)) {
			for (final Object p : params) {
				this.p(p);
			}
		}
		return this;
	}

	// ================================================================= WHERE ================================================================= //
	/** WHERE子句 */
	private SQL whereCodition;

	/**
	 * 追加WHERE子句
	 * @param condition 条件子句 
	 * @return 本对象
	 */
	public SELECT where(final SQL condition) {
		if (this.whereCodition != null) { throw new KRuntimeException(ErrorCodeX.RepeatCall); }
		this.whereCodition = condition;
		return this;
	}

	@Override
	public String getSentence() {
		return StringFormatter.of()//
				.s(this.sql.getSentence())//
				.x(" %s", () -> {
					if (SELECT.this.whereCodition == null) { return StringFormatter.Type.Ignore; }
					return "WHERE " + this.whereCodition.getSentence();
				}).format();
	}

	@Override
	public List<Object> getParams() {
		final List<Object> params = new ArrayList<>();
		// sql params
		params.addAll(this.sql.getParams());
		// WHERE params
		if (this.whereCodition != null) {
			params.addAll(this.whereCodition.getParams());
		}
		return params;
	}

}
